package main

import (
	"fmt"
	"time"
)

//1）main的goroutine结束了就意味着整个程序的运行已经结束了，换言之，go的执行是非阻塞的，不会等待
//
//2）不同goroutine之间的代码次序并不能代表真正的执行顺序
//
//3）go后边的函数的返回值会被忽略，也就是说协程不能有返回值
//
//4）没有父子goroutine的概念，所有的goroutine是平等的被调度和执行的
//
//5）go程序在执行时会单独为main创建一个goroutine，遇到其他go关键字再去创建其他的goroutine
//
//6）go没有暴露goroutine id给用户，所以不能在一个goroutine里面显式的操作另外一个goroutine

type Person struct {
	Name string
	Age  int
}

func main() {
	var ch chan string = make(chan string, 2)
	human := &Person{}
	go test(ch) //主协程将goroutine
	sr := <-ch
	fmt.Println("sr", sr)
	time.Sleep(1 * time.Second)

	fmt.Println("human", human)

	fmt.Println("over")
}

func test(ch chan string) {
	defer func() {
		close(ch)
	}()
	ch <- "hello-ch"
	fmt.Println("test", time.Now())
}
func test2() {
	fmt.Println("test2", time.Now())

}
